package com.example.design.proxy.staticstate;

/**
 * 代理模式主要涉及到抽象主题角色、代理主题角色、真实主题角色三个角色：
 *
 * 抽象主题角色：声明了真实主题和代理主题的共同接口，这样一来在任何可以使用真实主题的地方都可以使用代理主题。
 * 真实主题角色：定义了代理角色所代表的真实对象。
 * 代理主题角色：代理主题角色内部含有对真实主题的引用，从而可以在任何时候操作真实主题对象;
 *              代理主题角色提供一个与真实主题角色相同的接口，以便可以在任何时候都可以替代真实主体;
 *              控制对真实主题的引用，负责在需要的时候创建真实主题对象（和删除真实主题对象);
 *              代理角色通常在将客户端调用传递给真实的主题之前或者之后，都要执行某个操作，而不是单纯地将调用传递给真实主题对象。
 *
 * 静态代理总结：
 *      优点：可以做到在符合“开闭原则”的情况下对目标对象进行功能扩展。
 *      缺点：我们得为每一个目标对象都得创建代理类，工作量太大，不易管理。同时接口一旦发生改变，代理类也得相应修改。
 */
public class Client {
    public static void main(String[] args) {
        //创建目标对象(被代理的对象)
        MathTeacher mathTeacher = new MathTeacher();
        //创建代理对象，同时将被代理对象传递给代理对象
        TeacherProxy teacherProxy = new TeacherProxy(mathTeacher);
        //通过代理对象调用到被代理对象的方法(执行的是代理对象的方法，代理对象再去调用目标对象的方法)
        teacherProxy.teach();
    }
}
